package carte.element;

import java.awt.Color;
import java.util.ArrayList;

import carte.Carte;
import carte.Cellule;

public class Water extends Fluid implements Cloneable, Sendable {

	private static final String typeName = "Water";
	// lorsque l'utilisateur (god) dechaine cet element, il le fait sur un range
	// de CLICK_RANGE avec une quantite QUANTITY_GOD avec une proba de RATIO_GOD
	public final static int RANGE_GOD = 25;
	public final static float RATIO_GOD = 0.3f;
	public final static int QUANTITY_GOD = 3;
	// evaporation de l'eau
	public static final float EVAPORATION_RATE = 0.01f;

	public Water() {
		super(new Color(35, 143, 197), 0, typeName, false);
	}

	public Water(int quantity) {
		super(new Color(35, 143, 197), quantity, typeName, false);
	}

	public static String getTypeName() {
		return typeName;
	}

	public void evolve(ArrayList<Cellule> oldEnv, ArrayList<Cellule> newEnv) {
		// il y a une probabilité que l s'evapore
		float evaporationRate = EVAPORATION_RATE;
		//nombre de cases d'eau environnant
		int waterAround = 0;
		// il y a plus de chance que l'eau s'evapore si l'eau est isolee et
		// encore plus s'il y a de la lave
		for (int index = 1; index < oldEnv.size() ; index ++) {
			if (oldEnv.get(index).containFluid()) {
				if (oldEnv.get(index).getFluid() instanceof Water) {
					waterAround ++;
				}
				else if(oldEnv.get(index).getFluid() instanceof Lava){
					evaporationRate += 0.3f;
				}
			}
		}
		//plus l'eau est isolee, plus elle s'evapore vite
		evaporationRate += (0.1f * Math.max(0, 5-waterAround));
		
		//evaporation
		if (newEnv.get(0).getFluid().getQuantity() > 0) {
			if (rand.nextFloat() < EVAPORATION_RATE) {
				newEnv.get(0).removeFluid(1);
			}
		}
		// l'eau n'évolue que si elle est au-dessus du niveau de la mer
		if (oldEnv.get(0).computeElevation() > Carte.SEA_ALTITUDE) {
			super.evolve(oldEnv, newEnv);
		}
	}

	// on peut cloner le mana
	public Object clone() {
		Water water = null;
		// On récupère l'instance à renvoyer par l'appel de la
		// méthode super.clone()
		water = (Water) super.clone();
		// on renvoie le clone
		return water;
	}

}
